5.14. Встроенные функции в Swift
Встроенные функции в Swift
Swift использует набор зарезервированных слов для построения синтаксиса языка. Все ключевые слова разделены на логические группы по назначению.
Объявления и определения типов
| Ключевое слово | Значение | Пример |
|---|---|---|
class | Объявление класса | class User { } |
struct | Объявление структуры | struct Point { } |
enum | Объявление перечисления | enum Status { case active } |
protocol | Объявление протокола | protocol Drawable { } |
extension | Расширение существующего типа | extension String { } |
func | Объявление функции | func greet() { } |
init | Объявление инициализатора | init(name: String) { } |
deinit | Объявление деинициализатора | deinit { print("Удалён") } |
var | Объявление переменной | var count = 0 |
let | Объявление константы | let pi = 3.14 |
typealias | Создание псевдонима типа | typealias ID = String |
associatedtype | Объявление ассоциированного типа в протоколе | associatedtype Element |
operator | Объявление пользовательского оператора | operator infix ** |
precedencegroup | Определение приоритета оператора | precedencegroup PowerPrecedence { } |
subscript | Объявление индексатора | subscript(index: Int) -> String { } |
Модификаторы доступа и контекста
| Ключевое слово | Значение | Пример |
|---|---|---|
private | Ограничение видимости текущим объявлением | private var secret: String |
fileprivate | Ограничение видимости текущим файлом | fileprivate func helper() { } |
internal | Видимость в пределах модуля (по умолчанию) | internal class Service { } |
public | Видимость за пределами модуля | public struct API { } |
open | Видимость с возможностью переопределения извне модуля | open class Base { } |
static | Принадлежность типу, а не экземпляру | static let version = "1.0" |
final | Запрет наследования или переопределения | final class Singleton { } |
mutating | Разрешение изменения свойств в методе структуры | mutating func update() { } |
nonmutating | Указание отсутствия изменения состояния | nonmutating func copy() -> Self |
lazy | Отложенная инициализация свойства | lazy var cache = loadCache() |
override | Переопределение метода или свойства базового класса | override func draw() { } |
convenience | Вспомогательный инициализатор | convenience init() { self.init(id: 0) } |
required | Обязательный инициализатор для наследников | required init(coder: NSCoder) { } |
indirect | Разрешение рекурсивных случаев в перечислении | indirect case node(Tree) |
Управляющие конструкции потока выполнения
| Ключевое слово | Значение | Пример |
|---|---|---|
if | Условное выполнение | if count > 0 { } |
else | Альтернативная ветка условия | if valid { } else { } |
switch | Множественный выбор по значению | switch status { case .active: break } |
case | Обработка конкретного значения в switch | case .error(let msg): |
default | Обработка всех остальных случаев | default: print("Неизвестно") |
for | Цикл по последовательности | for item in items { } |
in | Указание диапазона или коллекции в цикле | for i in 0..<10 { } |
while | Цикл с предусловием | while isActive { } |
repeat | Цикл с постусловием | repeat { } while needsRetry |
break | Прерывание цикла или ветки switch | if done { break } |
continue | Переход к следующей итерации цикла | if skip { continue } |
fallthrough | Продолжение выполнения в следующую ветку switch | case 1: fallthrough |
guard | Ранний выход при невыполнении условия | guard let user = user else { return } |
return | Возврат значения из функции | return result |
defer | Отложенное выполнение при выходе из области | defer { file.close() } |
where | Дополнительное условие в цикле или шаблоне | for item in items where item.active { } |
Обработка ошибок
| Ключевое слово | Значение | Пример |
|---|---|---|
throw | Генерация ошибки | throw NetworkError.timeout |
throws | Указание возможности генерации ошибки в сигнатуре | func load() throws -> Data |
rethrows | Передача ошибки из параметра-замыкания | func process(_ block: () throws -> Void) rethrows |
try | Вызов функции, которая может сгенерировать ошибку | let data = try loadData() |
try? | Преобразование ошибки в опциональное значение | let result = try? riskyOperation() |
try! | Принудительное игнорирование возможной ошибки | let value = try! safeOperation() |
catch | Обработка перехваченной ошибки | do { } catch { print(error) } |
do | Блок для перехвата ошибок | do { try operation() } catch { } |
Типы и преобразования
| Ключевое слово | Значение | Пример |
|---|---|---|
as | Преобразование типа | let str = value as String |
as? | Условное преобразование в опциональный тип | let num = value as? Int |
as! | Принудительное преобразование типа | let id = value as! UUID |
is | Проверка принадлежности к типу | if item is Video { } |
Any | Представление любого типа | func log(_ value: Any) { } |
Self | Тип текущего экземпляра в протоколе | func copy() -> Self |
self | Ссылка на текущий экземпляр | self.name = name |
super | Доступ к реализации базового класса | super.viewDidLoad() |
nil | Отсутствие значения для опционального типа | var user: User? = nil |
true | Логическое значение истины | let active = true |
false | Логическое значение лжи | let disabled = false |
_ | Игнорирование значения или параметра | for _ in 0..<5 { } |
Свойства и наблюдатели
| Ключевое слово | Значение | Пример |
|---|---|---|
get | Геттер для вычисляемого свойства | var title: String { get { return raw } } |
set | Сеттер для вычисляемого свойства | set { raw = newValue } |
willSet | Наблюдатель перед изменением значения | willSet { print("Будет: \(newValue)") } |
didSet | Наблюдатель после изменения значения | didSet { updateUI() } |
inout | Передача параметра по ссылке | func swap(_ a: inout Int, _ b: inout Int) |
Управление памятью
| Ключевое слово | Значение | Пример |
|---|---|---|
weak | Слабая ссылка без увеличения счётчика | weak var delegate: Handler? |
unowned | Непринадлежащая ссылка без проверки на nil | unowned let parent: Container |
optional | Объявление опционального требования в протоколе | @objc optional func didLoad() |
Прочие ключевые слова
| Ключевое слово | Значение | Пример |
|---|---|---|
import | Импорт модуля или символа | import Foundation |
some | Указание существования конкретного типа (opaque types) | func makeView() -> some View |
dynamic | Разрешение динамической диспетчеризации через Objective-C runtime | dynamic var title: String |
infix | Бинарный оператор между операндами | infix operator ** |
prefix | Унарный оператор перед операндом | prefix operator ++ |
postfix | Унарный оператор после операнда | postfix operator ++ |
left | Левая ассоциативность оператора | associativity: left |
right | Правая ассоциативность оператора | associativity: right |
none | Отсутствие ассоциативности оператора | associativity: none |
Ключевые слова Swift не могут использоваться в качестве идентификаторов без экранирования обратными кавычками. Например, допустимо написать `class` в контексте имени переменной, но это не рекомендуется для повышения читаемости кода.